/*****************************************************************************
 * 例程名称		 : 空工程
 * 说明         : 新建项目可以直接复制空工程开始编程。
 * 接线方式     : ---
 * 注意    		 : ---
 *******************************************************************************/

//--包含你要使用的头文件--//
#include "config.h" //通用配置头文件
#include "isr.h"

/* 稳定按键事件标记 */
volatile uint32_t keyPressEvent = 0;
/* 编码器旋转计数 */
volatile uint32_t rotateCounter = 0;
/* UART接收缓冲区 */
//volatile uint8_t uart_rxdat[3];
/* UART接收状态机 */
volatile uint8_t uart_sm = 0;
/* UART接收完成标志 */
volatile uint8_t UART0_flag = 0;
/* UART数据包大小 */
#define UART_PACKET_SIZE 4
volatile uint8_t gRxPacket[UART_PACKET_SIZE];
/*************  本地常量声明    **************/
/*************  IO口定义    **************/
/*************  本地变量声明    **************/
/*************  本地函数声明    **************/
/****************  外部函数声明和外部变量声明 *****************/
/*******************************************************************************
 * 函 数 名         : main
 * 函数功能		     : 主函数
 * 输    入         : 无
 * 输    出         : 无
 *******************************************************************************/
int main(void)
{
	System_init(); // 天才第一步，使用SysConfig配置文件进行初始化。
#ifdef DEBUG	   // 调试模式下，检查GPIO是否复位和上电
#include <assert.h>
	assert(DL_GPIO_isReset(LED_PORT));
	assert(DL_GPIO_isPowerEnabled(LED_PORT));
#endif
	set_systick_ms(1);					  // 设置SysTick中断周期为1ms
	DL_DMA_setSrcAddr(DMA, DMA_CH0_CHAN_ID, (uint32_t)(&UART_0_INST->RXDATA));
	DL_DMA_setDestAddr(DMA, DMA_CH0_CHAN_ID, (uint32_t) &gRxPacket[0]);
	DL_DMA_setTransferSize(DMA, DMA_CH0_CHAN_ID, UART_PACKET_SIZE);
	DL_DMA_enableChannel(DMA, DMA_CH0_CHAN_ID);
	NVIC_EnableIRQ(UART_0_INST_INT_IRQN); // 使能UART中断
	while (1)
	{
		if(UART0_flag == 1) // 接收完成
		{
			UART0_flag = 0;
			if(gRxPacket[0] == 'o' && gRxPacket[1] == 'n') // 简单协议：收到'on'命令，执行操作
			{
				DL_GPIO_clearPins(LED_PORT, LED_LED_0_PIN); // 点亮LED
				DL_UART_transmitDataBlocking(UART_0_INST, 'O'); // 反馈
				DL_UART_transmitDataBlocking(UART_0_INST, 'K'); // 反馈
			}
			else if(gRxPacket[0] == 'o' && gRxPacket[1] == 'f' && gRxPacket[2] == 'f') // 收到'off'命令，执行操作
			{
				DL_GPIO_setPins(LED_PORT, LED_LED_0_PIN); // 熄灭LED
				DL_UART_transmitDataBlocking(UART_0_INST, 'O'); // 反馈
				DL_UART_transmitDataBlocking(UART_0_INST, 'K'); // 反馈
			}
			else
			{
				// 错误处理
			}
		}
	}
	return 0;
}
